জাভার জেনেরিক্সে Covariance এবং Contravariance ধারণাগুলো জেনেরিক টাইপগুলোর সাবটাইপিং সম্পর্ক নিয়ে কাজ করে। এই ধারণাগুলো টাইপ ইনহেরিটেন্সের সাথে মিল রেখে কাজ করে এবং জেনেরিক টাইপগুলোতে ফ্লেক্সিবিলিটি প্রদান করে।
Covariance
Covariance টাইপ সম্পর্কিত এমন একটি ধারণা যেখানে একটি জেনেরিক টাইপ তার সাবটাইপ গ্রহণ করতে পারে। এটি read-only অপারেশনের জন্য ব্যবহৃত হয়।
Covariance-এর জন্য Wildcards: <? extends Type>
<? extends Type>নির্দেশ করে যে টাইপটি Type বা তার সাবক্লাস হতে হবে।- Covariance সাধারণত ডেটা পড়তে ব্যবহৃত হয়, তবে নতুন ডেটা যোগ করা যায় না।
উদাহরণ:
import java.util.List;
import java.util.ArrayList;
public class CovarianceExample {
public static void printNumbers(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
public static void main(String[] args) {
List<Integer> intList = new ArrayList<>();
intList.add(10);
intList.add(20);
List<Double> doubleList = new ArrayList<>();
doubleList.add(3.14);
doubleList.add(1.23);
printNumbers(intList); // Works with Integer (subtype of Number)
printNumbers(doubleList); // Works with Double (subtype of Number)
}
}
আউটপুট:
10
20
3.14
1.23
Contravariance
Contravariance টাইপ সম্পর্কিত এমন একটি ধারণা যেখানে একটি জেনেরিক টাইপ তার সুপারটাইপ গ্রহণ করতে পারে। এটি write-only অপারেশনের জন্য ব্যবহৃত হয়।
Contravariance-এর জন্য Wildcards: <? super Type>
<? super Type>নির্দেশ করে যে টাইপটি Type বা তার সুপারক্লাস হতে হবে।- Contravariance সাধারণত ডেটা যোগ করতে ব্যবহৃত হয়, তবে ডেটা পড়া সম্ভব নয় (অবজেক্ট হিসেবে পড়া ছাড়া)।
উদাহরণ:
import java.util.List;
import java.util.ArrayList;
public class ContravarianceExample {
public static void addNumbers(List<? super Integer> list) {
list.add(10);
list.add(20);
}
public static void main(String[] args) {
List<Number> numberList = new ArrayList<>();
addNumbers(numberList); // Works with Number (supertype of Integer)
List<Object> objectList = new ArrayList<>();
addNumbers(objectList); // Works with Object (supertype of Integer)
System.out.println(numberList); // Output: [10, 20]
System.out.println(objectList); // Output: [10, 20]
}
}
আউটপুট:
[10, 20]
[10, 20]
Covariance বনাম Contravariance
| Aspect | Covariance | Contravariance |
|---|---|---|
| Wildcards | <? extends Type> | <? super Type> |
| Subtyping Direction | Accepts subtypes of the type | Accepts supertypes of the type |
| Usage | Used for reading data | Used for writing data |
| Flexibility | Provides flexibility in reading | Provides flexibility in writing |
| Example | List<? extends Number> | List<? super Integer> |
Covariance এবং Contravariance একত্রে ব্যবহার
import java.util.ArrayList;
import java.util.List;
public class CovarianceContravarianceExample {
public static void processList(List<? extends Number> inputList, List<? super Number> outputList) {
for (Number num : inputList) {
outputList.add(num); // Writing to the output list
}
}
public static void main(String[] args) {
List<Integer> integers = new ArrayList<>();
integers.add(10);
integers.add(20);
List<Object> objects = new ArrayList<>();
processList(integers, objects); // Covariance for input, Contravariance for output
System.out.println(objects); // Output: [10, 20]
}
}
কোডের ভুলের সম্ভাব্যতা কমানোর জন্য নিয়ম
- Covariance (
<? extends Type>) ব্যবহার করুন যখন ডেটা শুধু পড়া হবে। - Contravariance (
<? super Type>) ব্যবহার করুন যখন ডেটা শুধু লেখা হবে। - একই সময়ে Covariance এবং Contravariance ব্যবহার করুন যখন একটি লিস্ট থেকে পড়া এবং আরেকটি লিস্টে লেখা দরকার।
জাভার জেনেরিক্সে Covariance এবং Contravariance টাইপ সাবটাইপিং পরিচালনা করার একটি কার্যকর উপায়।
- Covariance ডেটা পড়ার জন্য কার্যকর, যেখানে টাইপের সাবক্লাসগুলোকে অনুমতি দেয়।
- Contravariance ডেটা লেখার জন্য কার্যকর, যেখানে টাইপের সুপারক্লাসগুলোকে অনুমতি দেয়। এই ধারণাগুলো টাইপ-সেইফ এবং ফ্লেক্সিবল কোড তৈরি করতে সাহায্য করে।
Read more